package primary;

/**
 * 泛型
 */
public class L_T {
    static class MyCollection {
        Object[] objs = new Object[5];

        void set(Object obj, int index) {
            objs[index] = obj;
        }

        public Object get(int index) {
            return objs[index];
        }
    }

    /**
     * 泛型类
     *
     * @param <E>
     */
    static class TCollection<E> {
        Object[] objs = new Object[5];

        void set(E e, int index) {
            objs[index] = e;
        }

        public E get(int index) {
            return (E) objs[index];
        }
    }

    /**
     * 泛型方法的基本介绍
     *
     * @param tClass 传入的泛型实参
     * @return T 返回值为T类型
     * 说明：
     * 1）public 与 返回值中间<T>非常重要，可以理解为声明此方法为泛型方法。
     * 2）只有声明了<T>的方法才是泛型方法，泛型类中的使用了泛型的成员方法并不是泛型方法。
     * 3）<T>表明该方法将使用泛型类型T，此时才可以在方法中使用泛型类型T。
     * 4）与泛型类的定义一样，此处T可以随便写为任意标识，常见的如T、E、K、V等形式的参数常用于表示泛型。
     */
    public <T> T genericMethod(Class<T> tClass) throws InstantiationException,
            IllegalAccessException {
        T instance = tClass.newInstance();
        return instance;
    }

    /**
     * 泛型接口
     * @param <T>
     */
    public interface TMethod<T> {
        public T get();
    }

    public static void main(String[] args) {
        MyCollection collection = new MyCollection();
        collection.set("yeung", 0);
        collection.set("alex", 2);
//        Integer a = (Integer) collection.get(0);//运行报错

        TCollection<String> tc = new TCollection<String>();
        tc.set("yeung", 2);
        System.out.println(tc.get(2));
        StringBuffer sb = new StringBuffer();

    }


}
